package com.bfxy.scanner;

import com.bfxy.annotation.Cmd;
import com.bfxy.annotation.Module;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;


/**
 * 使用BeanPostProcessor在bean初始化之后加载所有的bean，然后找到带有@Module的bean对象
 * 接下来进行扫描bean对象下的方法中带有@Cmd，注解的方法
 *  最后创建对应的invoker，并把他们加入到InvokerTable
 */
@Component
public class NettyProcessBeanScanner  implements BeanPostProcessor {


    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //1、获取当前bean的class类型
        Class<?> clazz=bean.getClass();
        boolean isPersent=clazz.isAnnotationPresent(Module.class);
        if(isPersent){
           Module module= clazz.getAnnotation(Module.class);
           Method[] methods= clazz.getMethods();
           if(methods!=null&&methods.length>0){
                 for(Method m:methods){
                     Cmd cmd= m.getAnnotation(Cmd.class);
                     if(cmd==null){
                         continue;
                     }
                     String moduleValue=module.module();
                     String cmdValue=cmd.cmd();
                     //只需要把moduleValue+cmdValue对应的反射对象（invoker）管理起来
                     if(InvokerTable.getInvoker(moduleValue,cmdValue)==null){
                         InvokerTable.addInvoder(moduleValue,cmdValue,Invoker.createInvoker(m,bean));
                     }else{
                         System.out.println("模块下的命令对应的程序缓存已经存在,module="+methods+",cmd="+cmdValue);
                     }
                 }
           }
        }
        return null;
    }
}
